package com.test.practice.oo.finalStatic;

public class FinalTest3 {

    private final String S = "final实例变量S";

    private final int A = 100;

    public final int B = 90;

    public static final int C = 80;

    private static final int D = 70;

    public final int E;

    /**
     * The blank final field E may not have been initialized
     * 如果不在最初定义其值或者不在构造方法中赋值，就会编译报错。final空白,必须在初始化对象的时候赋初值。
     */
    public FinalTest3(int x) {
        E = x;
    }

    public static void main(String[] args) {
        FinalTest3 test3 = new FinalTest3(2);
        /**
         * The final field FinalTest3.A cannot be assigned。出错,final变量的值一旦给定就无法改变
         */
        // test3.A = 1;
        // test3.B = 2;
        // test3.C = 3;
        // test3.D = 4;

        System.out.println(test3.A);
        System.out.println(test3.B);
        // 不推荐用对象方式访问静态字段
        System.out.println(test3.C);
        // 不推荐用对象方式访问静态字段
        System.out.println(test3.D);
        System.out.println(FinalTest3.C);
        System.out.println(FinalTest3.D);
        /**
         * Cannot make a static reference to the non-static field FinalTest3.E
         * 出错,因为E为final空白,依据不同对象值有所不同.
         */
        // System.out.println(FinalTest3.E);

        System.out.println(test3.E);

        FinalTest3 test32 = new FinalTest3(5);
        // final空白变量E依据对象的不同而不同
        System.out.println(test32.E);
        System.out.println("--------------------");
        test32.test();
    }

    private void test() {
        System.out.println(new FinalTest3(6).A);
        System.out.println(FinalTest3.C);
        System.out.println(FinalTest3.D);
    }

    public void test2() {
        final int a;// final空白，在需要的时候才赋值，可以简单的理解为局部只能赋值一次的变量
        final int b = 4; // 局部常量--final用于局部变量的情形
        final int c;// final空白,一直没有给赋值

        a = 4;
        /**
         * The final local variable b cannot be assigned. It must be blank and
         * not using a compound assignment 已经给赋过值了
         */
        // b = 5;
        /**
         * The final local variable a may already have been assigned 已经给赋过值了
         */
        // a = 3;
    }
}
